part of swarmlib;

/// An iterator that allows the user to move forward and backward though
/// a set of items. (Bi-directional)
class BiIterator<E> {
  /// Provides forward and backward iterator functionality to keep track
  /// which item is currently selected.
  ObservableValue<int> currentIndex;

  /// The collection of items we will be iterating through.
  List<E> list;

  BiIterator(this.list, [List<ChangeListener>? oldListeners])
    : currentIndex = ObservableValue<int>(0) {
    if (oldListeners != null) {
      currentIndex.listeners = oldListeners;
    }
  }

  /// Returns the next section from the sections, given the current
  /// position. Returns the last source if there is no next section.
  E next() {
    if (currentIndex.value < list.length - 1) {
      currentIndex.value += 1;
    }
    return list[currentIndex.value];
  }

  /// Returns the current Section (page in the UI) that the user is
  /// looking at.
  E get current {
    return list[currentIndex.value];
  }

  /// Returns the previous section from the sections, given the current
  /// position. Returns the front section if we are already at the front of
  /// the list.
  E previous() {
    if (currentIndex.value > 0) {
      currentIndex.value -= 1;
    }
    return list[currentIndex.value];
  }

  /// Move the iterator pointer over so that it points to a given list item.
  void jumpToValue(E val) {
    for (int i = 0; i < list.length; i++) {
      if (identical(list[i], val)) {
        currentIndex.value = i;
        break;
      }
    }
  }
}
